﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using BLL;
using Exceptions;

namespace WCF
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "WCFAlojamento" in code, svc and config file together.
    public class WCFAlojamento : IWCFAlojamento
    {
        public List<DTO.Alojamento> list()
        {
            BLLAlojamento bllAlojamentos = new BLLAlojamento();
            List<BTO.Alojamento> btoAlojamentos = bllAlojamentos.list();
            List<DTO.Alojamento> dtoAlojamentos = new List<DTO.Alojamento>();
            DTO.Alojamento dtoAlojamento;

            foreach (BTO.Alojamento btoAlojamento in btoAlojamentos)
            {
                dtoAlojamento = new DTO.Alojamento();
                dtoAlojamento.IDAlojamento = btoAlojamento.IDAlojamento;
                dtoAlojamento.nome = btoAlojamento.nome;
                dtoAlojamento.morada = btoAlojamento.morada;
                dtoAlojamento.IDTipoAlojamento = btoAlojamento.IDTipoAlojamento;
                dtoAlojamento.lotacao = btoAlojamento.lotacao;
                dtoAlojamento.telefone = btoAlojamento.telefone;
                dtoAlojamento.email = btoAlojamento.email;
                dtoAlojamento.IDLocal = btoAlojamento.IDLocal;
                dtoAlojamento.IDCategoria = btoAlojamento.IDCategoria;

                dtoAlojamentos.Add(dtoAlojamento);
            }

            return dtoAlojamentos;
        }

        public DTO.Alojamento getByID(int id)
        {
            BLLAlojamento bllAlojamentos = new BLLAlojamento();
            DTO.Alojamento dtoAlojamento = new DTO.Alojamento();

            try
            {
                BTO.Alojamento btoAlojamento = bllAlojamentos.getByID(id);

                dtoAlojamento.IDAlojamento = btoAlojamento.IDAlojamento;
                dtoAlojamento.nome = btoAlojamento.nome;
                dtoAlojamento.morada = btoAlojamento.morada;
                dtoAlojamento.IDTipoAlojamento = btoAlojamento.IDTipoAlojamento;
                dtoAlojamento.lotacao = btoAlojamento.lotacao;
                dtoAlojamento.telefone = btoAlojamento.telefone;
                dtoAlojamento.email = btoAlojamento.email;
                dtoAlojamento.IDLocal = btoAlojamento.IDLocal;
                dtoAlojamento.IDCategoria = btoAlojamento.IDCategoria;

            }
            catch (NotFoundAlojamentoException e)
            {
                throw new NotFoundAlojamentoException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Alojamento não encontrado!");
            }

            return dtoAlojamento;
        }

        public DTO.Alojamento getByNome(string nomeAlojamento)
        {
            BLLAlojamento bllAlojamentos = new BLLAlojamento();
            DTO.Alojamento dtoAlojamento = new DTO.Alojamento();

            try
            {
                BTO.Alojamento btoAlojamento = bllAlojamentos.getByNome(nomeAlojamento);

                dtoAlojamento.IDAlojamento = btoAlojamento.IDAlojamento;
                dtoAlojamento.nome = btoAlojamento.nome;
                dtoAlojamento.morada = btoAlojamento.morada;
                dtoAlojamento.IDTipoAlojamento = btoAlojamento.IDTipoAlojamento;
                dtoAlojamento.lotacao = btoAlojamento.lotacao;
                dtoAlojamento.telefone = btoAlojamento.telefone;
                dtoAlojamento.email = btoAlojamento.email;
                dtoAlojamento.IDLocal = btoAlojamento.IDLocal;
                dtoAlojamento.IDCategoria = btoAlojamento.IDCategoria;

            }
            catch (NotFoundAlojamentoException e)
            {
                throw new NotFoundAlojamentoException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Alojamento não encontrado!");
            }

            return dtoAlojamento;
        }

        public List<DTO.Alojamento> getByTipoAlojamento(int tipoAlojamento)
        {
            BLLAlojamento bllAlojamentos = new BLLAlojamento();
            List<DTO.Alojamento> dtoAlojamentos = new List<DTO.Alojamento>();
            DTO.Alojamento dtoAlojamento;

            try
            {
                List<BTO.Alojamento> btoAlojamentos = bllAlojamentos.getByTipoAlojamento(tipoAlojamento);

                foreach (BTO.Alojamento btoAlojamento in btoAlojamentos)
                {
                    dtoAlojamento = new DTO.Alojamento();
                    dtoAlojamento.IDAlojamento = btoAlojamento.IDAlojamento;
                    dtoAlojamento.nome = btoAlojamento.nome;
                    dtoAlojamento.morada = btoAlojamento.morada;
                    dtoAlojamento.IDTipoAlojamento = btoAlojamento.IDTipoAlojamento;
                    dtoAlojamento.lotacao = btoAlojamento.lotacao;
                    dtoAlojamento.telefone = btoAlojamento.telefone;
                    dtoAlojamento.email = btoAlojamento.email;
                    dtoAlojamento.IDLocal = btoAlojamento.IDLocal;
                    dtoAlojamento.IDCategoria = btoAlojamento.IDCategoria;

                    dtoAlojamentos.Add(dtoAlojamento);
                }
            }
            catch (NotFoundTipoAlojamentoException e)
            {
                throw new NotFoundTipoAlojamentoException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhum alojamento não encontrado!");
            }

            return dtoAlojamentos;
        }

        public List<DTO.Alojamento> getByCategoria(int idAlojamento)
        {
            BLLAlojamento bllAlojamentos = new BLLAlojamento();
            List<DTO.Alojamento> dtoAlojamentos = new List<DTO.Alojamento>();
            DTO.Alojamento dtoAlojamento;
            try
            {
                List<BTO.Alojamento> btoAlojamentos = bllAlojamentos.getByCategoria(idAlojamento);

                foreach (BTO.Alojamento btoAlojamento in btoAlojamentos)
                {
                    dtoAlojamento = new DTO.Alojamento();
                    dtoAlojamento.IDAlojamento = btoAlojamento.IDAlojamento;
                    dtoAlojamento.nome = btoAlojamento.nome;
                    dtoAlojamento.morada = btoAlojamento.morada;
                    dtoAlojamento.IDTipoAlojamento = btoAlojamento.IDTipoAlojamento;
                    dtoAlojamento.lotacao = btoAlojamento.lotacao;
                    dtoAlojamento.telefone = btoAlojamento.telefone;
                    dtoAlojamento.email = btoAlojamento.email;
                    dtoAlojamento.IDLocal = btoAlojamento.IDLocal;
                    dtoAlojamento.IDCategoria = btoAlojamento.IDCategoria;

                    dtoAlojamentos.Add(dtoAlojamento);
                }
            }
            catch (NotFoundAlojamentoException e)
            {
                throw new NotFoundAlojamentoException(e.Message);
            }
            catch (Exception)
            {
                throw new Exception("Nenhum alojamento não encontrado!");
            }

            return dtoAlojamentos;
        }
    }
}
